#pragma once 
#include<iostream>
#include<string>
#include<ctime>
#include<pthread.h>
using namespace std;
typedef void (*callback_t)();//函数指针
static int num =1;//定义一个全局的num放在静态区

class Thread
{
public:
    //线程的执行函数
    static void *Routine(void *args)//这里要加static，因为放在静态区的成员函数不含有this指针，就不会占用该函数的第一个参数的位置，如果有this指针会导致线程执行函数的格式错误，无法成功创建线程
    {
        Thread*thread=static_cast<Thread *>(args);
        thread->Entery();
        return nullptr;
    }
    //从构造函数可以看出，我们需要传入一个无参的无返回值的函数作为线程的执行函数
    Thread(callback_t cb):tid_(0),name_(""),start_timestamp_(0),isrunning_(false),cb_(cb)
    {}
    //让线程启动
    void Run()
    {
        name_="thread-"+to_string(num++);
        start_timestamp_=time(nullptr);
        isrunning_=true;
        pthread_create(&tid_,nullptr,Routine,this);//传递的数据是自己这个类对象
    }
    void Join()
    {
        pthread_join(tid_,nullptr);
        isrunning_=false;
    }

    string Name()
    {
        return name_;
    }

    //返回开始运行的时间
    uint64_t StartTimestamp()
    {
        return start_timestamp_;
    }
    //判断是否正在运行
    bool IsRunning()
    {
        return isrunning_;
    }
    //入口
    void Entery()
    {
        cb_();//cb_是函数指针，也就是说cb_就是函数地址，可以直接用来调用函数（因为函数就是靠地址调用的），因为是无参的所以直接加()就可以调用
    }
    ~Thread()
    {

    }
private:
    pthread_t tid_;
    string name_;
    uint64_t start_timestamp_;
    bool isrunning_;

    callback_t cb_;
};